import json

from sqlalchemy import Column, Integer, String, Text, ForeignKey, Boolean
from sqlalchemy.dialects.mysql import MEDIUMTEXT
from sqlalchemy.orm import relationship
from Model.default import Base


class Group_Room(Base):
    # 为了减少空字段的效率问题,采用多张
    __tablename__ = 'chat_group_rooms'

    room_id = Column(String(50), primary_key=True)  # 房间的唯一标识
    created_at = Column(String(50), nullable=False)  # 创建时间
    is_active = Column(Boolean, default=True)  # 是否活跃，使用 Boolean 类型代替 Integer
    #群名称和其他可少量拓展信息
    group_name= Column(String(20))
    head_image=Column(MEDIUMTEXT)
    # 定义与 UserRoom 的关系（反向引用）
    # 采用json格式将所有用户id存到里面
    user_info=Column(MEDIUMTEXT)
    created_user=Column(Integer)

    def to_dict(self):
        result = {}
        for col in self.__table__.columns:
            key = col.name
            value = getattr(self, key, None)
            # 检查是否是指定的 JSON 字段
            if key == 'user_info' and value is not None:
                try:
                    # 尝试解析 JSON 字符串
                    value = json.loads(value)
                except json.JSONDecodeError:
                    # 如果解析失败，保留原始值
                    pass

            result[key] = value
        return result


class Group_Message(Base):
    __tablename__ = 'group_messages'
    id = Column(String(50), primary_key=True)  # 消息的唯一标识
    timestamp = Column(String(50), nullable=False)  # 消息时间戳
    content = Column(Text, nullable=False)  # 消息内容

    # 采用每条信息通过id绑定到room
    room_id = Column(String(50), ForeignKey('chat_group_rooms.room_id',ondelete="SET NULL")) # 关联的房间 ID,删除时设置为null使得可以删除父表数据而不删除子表

    #发送者信息
    sender_id = Column(Integer, nullable=False)
    # 可diy的类型
    message_type = Column(String(20), nullable=True)  # 消息类型
    #反向引用room用于获取room状态
    room=relationship("Group_Room")

class Double_Room(Base):
    __tablename__ = 'chat_double_room'
    room_id = Column(String(50), primary_key=True, nullable=False)
    created_at = Column(String(50), nullable=False)  # 创建时间
    one= Column(Integer, nullable=False)
    another= Column(Integer, nullable=False)
    is_active = Column(Boolean, default=True)

    def to_dict(self):

        result = {}
        for col in self.__table__.columns:
                key = col.name
                value = getattr(self, key, None)
                # 检查是否是指定的 JSON 字段
                result[key] = value
        return result





class Double_Message(Base):
    __tablename__ = 'double_messages'
    id = Column(String(50), primary_key=True)
    timestamp = Column(String(50), nullable=False)
    content = Column(Text, nullable=False)

    room_id = Column(String(50), ForeignKey('chat_double_room.room_id',ondelete="SET NULL"),)# 关联的房间 ID,删除时设置为null使得可以删除父表数据而不删除子表

    receiver_id = Column(Integer,nullable=False)
    sender_id = Column(Integer, nullable=False)

    room=relationship("Double_Room")


class Request_Room(Base):
    __tablename__ = 'chat_request_rooms'
    # 为了减少对api的修改和更多解析条件的消耗,单独处理申请中的房间。
    # 这个是用于请求添加,所以只针对群申请加入和好友添加
    #romm_id:已经存在的群聊id/新建的double
    room_id = Column(String(50), primary_key=True)
    room_type = Column(String(20), nullable=False)
    created_at = Column(String(50))  #仅仅用于表示提交时间
    is_active=Column(Boolean, default=True)
    one= Column(Integer)
    another= Column(Integer)
    user_id=Column(Integer,ForeignKey('user.id'))         #用于双向绑定
    # 0申请,1成功,-1拒绝,2过期
    status=Column(Integer,default=0)

    def to_dict_transform(self):
        # 用于转义为double
        result = {}
        for col in self.__table__.columns:
            key = col.name
            value = getattr(self, key, None)

            if key == 'room_type' or key == 'user_id':
                    # 过滤掉room_type,和user_id使得直接转换类型
                    continue
            result[key] = value
        return result

    def to_dict(self):
        result = {}
        for col in self.__table__.columns:
            key = col.name
            value = getattr(self, key, None)
            # 检查是否是指定的 JSON 字段
            result[key] = value
        return result

class Group_Room_Expand(Base):
    __tablename__ = 'chat_room_expand'
    id= Column(String(50), primary_key=True)
    room_id = Column(String(50), ForeignKey('chat_group_rooms.room_id',ondelete="SET NULL"), ) # 关联的房间 ID,删除时设置为null使得可以删除父表数据而不删除子表
    #用于存储申请信息
    request_info=Column(MEDIUMTEXT)
    room = relationship("Group_Room")






